package com.atguigu.lambda;
import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;
/*lambda表达式的使用
1.举例:(o1,o2)->Integer.compare(o1,o2)
2.格式:
->:lambda操作符或箭头操作符
左边:lambda形参列表(其实就是接口中抽象方法的形参列表)
右边:lambda体(其实就是重写抽象方法的方法体)
3.lambda表达式的使用:(分为6种情况)
4.lambda表达式的本质:作为接口的一个实例
 */

public class lambdaTest2 {
    //语法格式1:无参，无返回值
    @Test
    public void test1(){
        Runnable r1=()-> System.out.println("我爱北京");
    }
    //语法格式2:需要一个参数，无返回值
    @Test
    public void test2() {
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("I love zl");
        System.out.println("******************************");
        Consumer<String> con2 = (String s) -> {
            System.out.println(s);
        };
        con2.accept("I love hzl");
    }
    //语法格式三:数据类型可以省略，编译器可以推断得出，即类型推断
    @Test
    public void test3(){
        Consumer<String> con2 = (s) -> {
            System.out.println(s);
        };
    }
    //语法格式四:lambda 若只需要一个参数，参数的小括号可以省略
    @Test
    public void test4(){
        Consumer<String> con=s-> {System.out.println(s);};
        con.accept("hz");
    }
    //语法格式五:lambda需要两个或以上的参数，多条执行语句，并且可以有返回值
    @Test
    public void test5(){
        Comparator<Integer> com1=new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };
        //lambda表达式写法
        Comparator<Integer> com2=(o1,o2)->{
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(1, 2));
    }
    //语法格式6:当lambda体只有一条语句时，return与大括号若有，都可以省略
    @Test
    public void test6(){
        Comparator<Integer> com=(o1,o2)->o1.compareTo(o2);
        System.out.println(com.compare(5,2));
    }
}
